package org.leetcode.middle.leetcode96;

public class Solution {
    public int numTrees(int n) {
        //dp[i]的含义：由i个节点构成的不同搜索树的数量
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;

        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                //从1作为头节点开始到i作为头节点结束
                int left = dp[j - 1];
                int right = dp[i - j];
                dp[i] = dp[i] + left * right;
            }
        }
        return dp[n];
    }
}
